<template>
  <div class="search-container">
    <van-nav-bar title="搜索中心" left-arrow @click-left="$router.back()" />
    <!-- 搜索框 -->
    <van-search
      v-model="value"
      show-action
      placeholder="请输入搜索关键词"
      @search="onSearch"
      @input="onInput"
    >
      <template #action>
        <div @click="onSearch">搜索</div>
      </template>
    </van-search>
    <!-- 搜索推荐词 -->
    <van-cell-group>
      <van-cell
        v-for="(item, index) in showList"
        :key="index"
        icon="search"
        @click="
          $router.push({ path: '/searchResult', query: { q: list[index] } })
        "
      >
        <!-- cell无法解析HTML标签，使用插槽 + v-html 指令 实现搜索关键字高亮 -->
        <template #title>
          <div v-html="item"></div>
        </template>
      </van-cell>
    </van-cell-group>
    <!-- 历史记录 -->
    <van-cell-group>
      <van-cell title="历史记录" />
      <van-cell title="JavaScript">
        <template #right-icon>
          <van-icon name="close" />
        </template>
      </van-cell>
      <van-cell title="JS">
        <template #right-icon>
          <van-icon name="close" />
        </template>
      </van-cell>
    </van-cell-group>
  </div>
</template>

<script>
import { getSuggestionList } from './home.js'
export default {
  name: 'search',
  data () {
    return {
      value: '',
      list: [],
      timerId: null // 防抖 清除定时器的变量
    }
  },
  methods: {
    //   搜索框 enter 或 点击搜索按钮
    onSearch () {
      // console.log(this.value)
      this.$router.push({ path: '/searchResult', query: { q: this.value } })
    },
    //   input 事件
    onInput () {
      //   console.log(this.value)
      /* 函数防抖
          因使用定时器， async 修饰词就要修饰定时器的回调函数
      */
      clearTimeout(this.timerId)
      this.timerId = setTimeout(async () => {
        // 非空判断
        if (this.value.length == 0) return (this.list = [])
        let res = await getSuggestionList(this.value)
        // console.log(res)
        this.list = res.data.data.options
      }, 500)
    }
  },
  //   计算属性
  computed: {
    showList () {
      return this.list.map(item => {
        //   正则匹配出所有满足输入框中内容的值
        let reg = new RegExp(this.value, 'ig')
        /*
            replace 字符换替换方法
                第一个参数 ： 匹配条件， 可以是字符串，也可以是正则
                第二个参数 ： 替换结果， 字符串或者函数 (string | function)
            match => { return 值 }   match ： 当前匹配结果  return 值 ： 当前替换的值
        */
        return item.replace(
          reg,
          match => `<span style="color: red">${match}</span>`
        )
      })
    }
  }
}
</script>

<style lang="less">
.search-container {
  .van-nav-bar {
    background-color: #0098fa;
    .van-icon {
      color: #fff;
    }
    .van-nav-bar__title {
      color: #fff;
    }
  }
}
</style>
